Um guia introdutório para importar, transformar, analisar e modelar dados
7ª Semana da Matemática Aplicada (SEMAP),
Universidade Estadual de Campinas (UNICAMP)
Agosto de 2025
Julia, lançada oficialmente em 2012, tem se destacado como uma alternativa moderna para ciência de dados e computação científica, competindo com linguagens como Matlab, Python e R;Julia é gratuita;Julia oferece desempenho próximo ao de C++, aliado à facilidade de aprendizado e sintaxe simples, comparáveis a Python e R;Julia permite escrever código com símbolos matemáticos diretamente 🤓, facilitando a expressão de conceitos científicos;Julia resolve o problema das duas linguagens 🆒;Atribuindo valores a diferentes variáveis e vetores
Acessando aos elementos dos vetores
Qual a diferença entre
e
Observação: O . (dot) faz com que a operação seja feita em todos os elementos do vetor.
Instalar pacotes:
Nota
Boas práticas em Julia são:
Se quiser saber mais acerca de boas práticas, veja aqui.
Nesta seção veremos como importar nossos datasets, estando eles armazenados localmente ou online. Também veremos a diferença na leitura de diferentes formatos, como .csv, .txt e .xlsx.
Julia conta com diversos pacotes para leitura de datasets, dentre eles:
DataFrames : Manipulação e análise de dados em formato tabular, similar ao pandas (Python) ou data.frame (R);CSV : Leitura e escrita de arquivos CSV de forma rápida e eficiente;XLSX : Leitura e escrita de arquivos Excel (.xlsx).Com os pacotes necessários instalados, agora vejamos como as funções de leitura funcionam:
Podemos usar a função download() para baixar um arquivo temporariamente e retorna o caminho local onde ele foi salvo.
Ex.:
Agora, vamos ler os dados que usaremos na aula de hoje.
using CSV
using DataFrames
file = "https://raw.githubusercontent.com/Arthur-Dionizio/minicurso-julia/main/datasets/dataset.csv";
dados = CSV.read(download(file), DataFrame);
first(dados, 5)5×21 DataFrame
Row │ Column1 track_id artists album_name ⋯
│ Int64 String31 String? String? ⋯
─────┼──────────────────────────────────────────────────────────────────────────
1 │ 0 5SuOikwiRyPMVoIQDJUgSV Gen Hoshino Comedy ⋯
2 │ 1 4qPNDBW1i3p13qLCt0Ki3A Ben Woodward Ghost (Acousti
3 │ 2 1iJBSr7s7jYXzM8EGcbK5b Ingrid Michaelson;ZAYN To Begin Again
4 │ 3 6lfxq3CG4xtTiEg7opyCyx Kina Grannis Crazy Rich Asi
5 │ 4 5vjLSffimiIP26QG5WcN2K Chord Overstreet Hold On ⋯
18 columns omitted
6×21 DataFrame
Row │ Column1 track_id artists album_name ⋯
│ Int64 String31 String? String? ⋯
─────┼──────────────────────────────────────────────────────────────────────────
1 │ 0 5SuOikwiRyPMVoIQDJUgSV Gen Hoshino Comedy ⋯
2 │ 1 4qPNDBW1i3p13qLCt0Ki3A Ben Woodward Ghost (Acousti
3 │ 2 1iJBSr7s7jYXzM8EGcbK5b Ingrid Michaelson;ZAYN To Begin Again
4 │ 3 6lfxq3CG4xtTiEg7opyCyx Kina Grannis Crazy Rich Asi
5 │ 4 5vjLSffimiIP26QG5WcN2K Chord Overstreet Hold On ⋯
6 │ 5 01MVOl9KtVTNfFiBU9I7dc Tyrone Wells Days I Will Re
18 columns omitted
Conhecendo o dataset
Conhecendo o dataset
Conhecendo o dataset
A biblioteca Tidier.jl possui vários pacotes que auxiliam na manipulação e análise de datasets. Para quem está vindo do R, esses pacotes são bem similares e intuitivos. Aqui estão alguns dos pacotes:
TidierData : Implementação 100% Julia dos pacotes dplyr e tidyr do R. Usado na tranformação e manipulação dos dados;TidierPlots : Implementação 100% Julia do pacote ggplot2 do R;TidierStrings : O objetivo deste pacote é replicar o stringr do R em Julia de uma forma que funcione com o Tidier ou como uma função autônoma.Acessem o link
https://tidierorg.github.io/Tidier.jl/v1.6.1/para mais informações!
Para a nossa análise de hoje, vamos utilizar principalmente o pacote TidierData.
Funções Macro
Para suportar a programação no estilo R, o TidierData.jl é implementado usando macros. Isso ocorre porque as macros são capazes de “capturar” o código antes de executá-lo, o que permite que o pacote suporte “expressões tidy” semelhantes ao R que, de outra forma, não seriam consideradas código Julia válido.
using TidierData
@chain dados begin
@filter(popularity > 50)
@arrange(desc("energy"))
@select(track_name, popularity, energy, acousticness)
@slice(1:5)
end5×4 DataFrame
Row │ track_name popularity energy acousticness
│ String? Int64 Float64 Float64
─────┼────────────────────────────────────────────────────────────────
1 │ Meeresrauschen zum Schlafen 52 0.999 0.554
2 │ Voodoo People 56 0.998 0.00128
3 │ Bleed 60 0.998 8.12e-6
4 │ Wait A Minute 58 0.998 0.0496
5 │ Hooked 52 0.998 0.0207
Para quem já está familiarizado com a linguagem R, a função @chain() é similar ao pipeline %>% ou |>, usado para encadear várias operações em sequência no mesmo conjunto de dados.
@filter() : Filtra as linhas com base em uma restrição;@arrange() : Ordena as linhas com base em uma coluna (desc() para definir ordem crescente ou decrescente);@select() : Seleciona as colunas de interesse;@slice() : Seleciona as linhas para visualização.Obs.: A função
desc()é uma função auxiliar.
Existem algumas funções auxiliares do pacote que é importante citarmos:
across() : Aplica uma função a várias colunas de uma vez;n() e row_number() : Retornam o número total de linhas ou o número da linha;replace_missing() : Substitui valores ausentes em uma coluna por um valor especificado.Outras funções auxiliares de outros pacotes que vale mencionar:
dropmissing() : Remove as linhas que contêm valores faltantes (missing);unique() : Retorna os valores distintos únicos de um vetor ou coluna, removendo duplicatas;nrow() : Retorna o número de linhas de um DataFrame ou matriz;any() : Testa se pelo menos um elemento de uma coleção (ou resultado de uma condição) é verdadeiro; retorna true ou false.Dica
Use a função any() e a função ismissing no formato row -> any(ismissing, row) para verificar se há colunas sem informação. Nesse caso, a função filter() da base do Julia é mais eficiente, no formato filter(condição, dados).
Limpeza do dataset do Spotify: Tratando valores faltantes
1×21 DataFrame
Row │ Column1 track_id artists album_name track_name popul ⋯
│ Int64 String31 String? String? String? Int64 ⋯
─────┼──────────────────────────────────────────────────────────────────────────
1 │ 65900 1kR4gIb7nGxHPI3D2ifs59 missing missing missing ⋯
16 columns omitted
1×21 DataFrame
Row │ Column1 track_id artists album_name track_name popul ⋯
│ Int64 String31 String? String? String? Int64 ⋯
─────┼──────────────────────────────────────────────────────────────────────────
1 │ 65900 1kR4gIb7nGxHPI3D2ifs59 missing missing missing ⋯
16 columns omitted
Vamos remover as linhas que possuem valores faltantes.
113999×21 DataFrame
Row │ Column1 track_id artists ⋯
│ Int64 String31 String ⋯
────────┼───────────────────────────────────────────────────────────────────────
1 │ 0 5SuOikwiRyPMVoIQDJUgSV Gen Hoshino ⋯
2 │ 1 4qPNDBW1i3p13qLCt0Ki3A Ben Woodward
3 │ 2 1iJBSr7s7jYXzM8EGcbK5b Ingrid Michaelson;ZAYN
4 │ 3 6lfxq3CG4xtTiEg7opyCyx Kina Grannis
5 │ 4 5vjLSffimiIP26QG5WcN2K Chord Overstreet ⋯
6 │ 5 01MVOl9KtVTNfFiBU9I7dc Tyrone Wells
7 │ 6 6Vc5wAMmXdKIAM7WUoEb7N A Great Big World;Christina Agui…
8 │ 7 1EzrEOXmMH3G43AXT1y7pA Jason Mraz
⋮ │ ⋮ ⋮ ⋮ ⋱
113993 │ 113993 4OkMK49i3NApR1KsAIsTf6 Chris Tomlin ⋯
113994 │ 113994 4WbOUe6T0sozC7z5ZJgiAA Lucas Cervetti
113995 │ 113995 2C3TZjDRiAzdyViavDJ217 Rainy Lullaby
113996 │ 113996 1hIz5L4IB9hN3WRYPOCGPw Rainy Lullaby
113997 │ 113997 6x8ZfSoqDjuNa5SVP5QjvX Cesária Evora ⋯
113998 │ 113998 2e6sXL2bYv4bSz6VTdnfLs Michael W. Smith
113999 │ 113999 2hETkH7cOfqmz3LqZDHZf5 Cesária Evora
18 columns and 113984 rows omitted
Verificaremos possíveis faixas duplicadas, e retirá-las caso haja alguma.
(89740, 113999)
89740×21 DataFrame
Row │ Column1 track_id artists a ⋯
│ Int64 String31 String S ⋯
───────┼────────────────────────────────────────────────────────────────────────
1 │ 0 5SuOikwiRyPMVoIQDJUgSV Gen Hoshino C ⋯
2 │ 1 4qPNDBW1i3p13qLCt0Ki3A Ben Woodward G
3 │ 2 1iJBSr7s7jYXzM8EGcbK5b Ingrid Michaelson;ZAYN T
4 │ 3 6lfxq3CG4xtTiEg7opyCyx Kina Grannis C
5 │ 4 5vjLSffimiIP26QG5WcN2K Chord Overstreet H ⋯
6 │ 5 01MVOl9KtVTNfFiBU9I7dc Tyrone Wells D
7 │ 6 6Vc5wAMmXdKIAM7WUoEb7N A Great Big World;Christina Agui… I
8 │ 7 1EzrEOXmMH3G43AXT1y7pA Jason Mraz W
⋮ │ ⋮ ⋮ ⋮ ⋱
89734 │ 113993 4OkMK49i3NApR1KsAIsTf6 Chris Tomlin S ⋯
89735 │ 113994 4WbOUe6T0sozC7z5ZJgiAA Lucas Cervetti F
89736 │ 113995 2C3TZjDRiAzdyViavDJ217 Rainy Lullaby #
89737 │ 113996 1hIz5L4IB9hN3WRYPOCGPw Rainy Lullaby #
89738 │ 113997 6x8ZfSoqDjuNa5SVP5QjvX Cesária Evora B ⋯
89739 │ 113998 2e6sXL2bYv4bSz6VTdnfLs Michael W. Smith C
89740 │ 113999 2hETkH7cOfqmz3LqZDHZf5 Cesária Evora M
18 columns and 89725 rows omitted
Julia torna possível compreender e explorar conjuntos de dados, identificando padrões, tendências e possíveis outliers antes da modelagem.Statistics.jl, StatsBase.jl, DataFrames.jl e TidierData.jl serão essenciais para a análise 🆒.mean(x): mediamedian(x): medianamode(x): moda (pacote StatsBase.jl)var(x): variância amostralstd(x): desvio padrãominimum(x): mínimomaximum(x): máximoquantile(x, p): p-éssimo quantil empíricolength(x): número de elementoscount(cond, x): conta elementos que satisfazem uma condição condcountmap(x): cria uma tabela de frequências (pacote StatsBase.jl)describe(df): fornece estatísticas descritivas de um data framecor(x, y): correlação entre duas variáveis x e ycov(x, y): covariância das variáveis x e yJulia oferece diversas bibliotecas para criar visualizações estatísticas de forma simples e flexível, permitindo a análise e interpretação de dados de maneira visual. Algumas bibliotecas populares incluem Plots.jl, StatsPlots.jl, Makie.jl e Gadfly.jl.
bloxplot(x): gráfico de caixasbar(x): gráfico de barrashistogram(x): histogramascatter(x): gráfico de dispersãodensity(x): gráfico de densidade
7ª SEMAP | Agosto de 2025 | www.ime.unicamp.br/julialang